package MapTest;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
HashMap集合
    1.底层数据结构是哈希表
    2.哈希表是一个怎样的数据结构你？
        哈希表是一个数组和单向链表的结合体
        数组:在查询方面效率很高，随机增删方面效率很低
        单向链表:在随机增删方面效率较高，查询方面效率很低
        哈希表将以上两种数据结构融合在一起，充分发挥它们各自的优点
    3.HashMap集合底层的源代码:
        public class HashMap{
            //HashMap底层实际上就是一个数组，数组存放着节点
            Node<K,V>[] table;

            //静态内部类HashMap.Node
            static class Node<K,V>{
                final int hash; //哈希值(哈希值是key的hashCode()方法的执行结果。哈希值通过哈希算法可以转换成数组的下标)
                final K key; //存储到Map集合中的那个key
                V value;  //存储到Map集合中的那个value
                Node<K,V> next; //下一个节点的内存地址
            }
        }

       哈希表:一维数组，这个数组中每一个元素是一个单向链表。(数组和链表的结合体)
    4.HashMap集合Key部分特点:
        无序，不可重复，无序是因为加元素的时候，Node节点不一定挂到哪个单向链表上
        不可重复是equals方法来保证HashMap集合的key不可重复
        如果key重复了，value会覆盖
        所有要重写equals方法和hashCode方法
    5.HashMap集合的默认初始化容量是16，默认加载因子是0.75
        这个默认加载因子是当HashMap集合底层数组的容量达到75%的时候，数组开始扩容
        重点:HashMap集合初始化容量必须是2的倍数，这是因为要达到散列均匀，为了提高HashMap集合的存取效率，所必须的
        扩容容量是原容量的2倍
        在单向链表中的元素大于8个时，单向链表结构会自动变成红黑树结构，当红黑树上的节点数量小于6时，会重新把红黑树变成单向链表数据结构
        这种方式是为了提高检索效率
 */
public class HashMapTest1 {
    public static void main(String[] args){
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"java");
        map.put(2,"c++");
        map.put(3,"php");
        map.put(1,"c");  //key重复的时候value会发生自动覆盖
        System.out.println(map.size());
        //遍历map集合
        Set<Map.Entry<Integer,String>> entrySet = map.entrySet();
        Iterator<Map.Entry<Integer,String>> it = entrySet.iterator();
        while(it.hasNext()){
            Map.Entry<Integer,String> me = it.next();
            System.out.println(me.getKey()+"-->"+me.getValue());
        }
    }
}
